package sort;

/**
 * 冒泡排序法
 */
public class BubbleSort {

    public static void main(String[] args) {
        /*
            如：将五个无序：24,69,80,57,13使用冒泡排序法将其排成一个从小到大的有序数列
            1)共有5个元素
            2)一共进行4轮排序，可以看成外层循环
            3)每1轮排序可以确定一个数的位置，如第一轮确定最大数，弟二轮确定第二大数
            4)当进行比较时，若前面的数大于后面的数，就交换
            5)每轮比较在减少 4->3->2->1
         */

        int[] arr = {24, 69, 80, 57, 13};
        int temp;// 用来辅助交换的变量
        for (int j = 0; j < 4; j++) { //4次比较
            //如果前面的数>后面的数，就交换
            if (arr[j + 1] < arr[j]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        System.out.println("==第一轮==");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        for (int j = 0; j < 3; j++) { //第二轮时缩小数组比较的范围，因为第一轮已经确定了最大数，所以减少一次比较
            //如果前面的数>后面的数，就交换
            if (arr[j + 1] < arr[j]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        System.out.println("\n==第二轮==");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        //第三轮 第四轮 第五轮以此类推
        //由于每轮排序的逻辑不变，变得只是比较次数，所以可以优化成双层for，将每轮比较的逻辑变成内层循环，比较轮数为外层循环

        for (int i = 0; i < 4; i++) { // 外层循环是4层，也就是4轮比较
            for (int j = 0; j < 4 - i; j++) { //内层比较次数4->3->2->1，可以和比较轮数联动
                //如果前面的数>后面的数，就交换
                if (arr[j + 1] < arr[j]) {
                     temp = arr[j];
                     arr[j] = arr[j + 1];
                     arr[j + 1] = temp;
                }
            }
            System.out.println("\n==第" + (i + 1) + "轮==");
            for (int k = 0; k < arr.length; k++) {
                System.out.print(arr[k] + " ");
            }
        }
    }
}
